#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <stdint.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <dlfcn.h>
#include <pthread.h>
#include <linux/fb.h>
#include <sys/ipc.h>
#include <sys/shm.h>

// void cleanup(int sig)
// {
//     wait(NULL);
// }

int main(int argc, char const *argv[])
{
    // struct sigaction act;
    // bzero(&act, sizeof(act));
    // act.sa_handler = cleanup;
    // act.sa_flags  |= SA_RESTART;
    // sigaction(SIGCHLD, &act, NULL);

    mkfifo("/tmp/fifo", 0666);
    int fifo = open("/tmp/fifo", O_RDWR);
    if(fifo == -1)
    {
        perror("open() fifo failed");
        exit(0);
    }

    char buf[100];
    time_t t;
    while(1)
    {
        if(fork() == 0)
        {
            bzero(buf, 100);
            time(&t);
            snprintf(buf, 100, "[%d] %s", getpid(), ctime(&t));
            printf("buf: %s", buf);

            int m = write(fifo, buf, strlen(buf));
            printf("m: %d\n", m);
            exit(0);
        }
        else
        {
            printf("父进程\n");
            wait(NULL);
            sleep(1);
        }
    }

    return 0;
}
